﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using Vra.DataAccess.Attributes;

namespace Vra.DataAccess.Misc
{
	/// <summary>
	/// Класс поможет с обработкой данных
	/// </summary>
	internal class MiscUtils
	{
		/// <summary>
		/// Возвращает объект из полученной строки
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <param name="reader"></param>
		/// <returns></returns>
		public static T Get<T>(SqlDataReader reader) where T : class, new()
		{
			if (reader == null)
				return null;
			T obj = new T();
			IList<string> columns = new List<string>(reader.FieldCount);
			//получаем список колонок
			for (int i = 0; i < reader.FieldCount; i++)
			{
				columns.Add(reader.GetName(i));
			}
			var props = typeof (T).GetFields().Where(p => p.GetCustomAttributes(typeof (ColumnAttribute), false).Any());
			foreach (var propertyInfo in props)
			{
				ColumnAttribute attr = propertyInfo.GetCustomAttributes(typeof (ColumnAttribute), false).Cast<ColumnAttribute>().First();
				string propName = string.IsNullOrEmpty(attr.Name) ? propertyInfo.Name : attr.Name;
				//такой колонки нет - идем на следующий шаг
				if (!columns.Contains(propName))
					continue;
				object value = reader[propName];
				if (value == DBNull.Value)
					value = null;
				if (value != null)
					propertyInfo.SetValue(obj, value);
			}
			return obj;
		}
	}
}
